package com.itany.corejava.code10_异常.zuoye;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月23日 17:15
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 定义一个User类，有id、username、password、phone、address
 * 通过控制台输入的方式实现以下方法，数据存储到集合ArrayList中
 * 根据以下说明，所有不符合要求的场景设计成自定义异常
 * 所有异常在方法中声明抛出，在菜单种捕获处理
 * 1.注册，注册时用户名不能重复，注册时密码需要输入2次，两次的密码必须一致
 * 2.登录，根据用户名与密码进行登录，登录的用户必须是注册过的用户
 * 3.修改密码，控制台输入一个需要修改密码的用户名，修改指定用户的密码
 *      修改密码时指定的用户必须存在
 *      修改密码时需要输入原密码，只有原密码正确才能修改
 *      修改密码时输入的两次密码必须一致
 *
 * 菜单:
 * 提示用户输入选项：1.注册 2.登录 3.修改密码 4.退出
 */
public class Test {
    private static Scanner sc=new Scanner(System.in);
    private static List<User> users=new ArrayList<>();
    private static int id=1;
    public static void main(String[] args) {
        showMenu();
    }

    /**
     * 定义一个菜单
     */
    public static void showMenu(){
        System.out.print("请输入选项(1.注册 2.登录 3.修改密码 4.退出):");
        int choice=sc.nextInt();
        switch (choice){
            case 1:
                try {
                    register();
                    System.out.println("恭喜您，注册成功！");
                } catch (UserExistException e) {
                    System.out.println("对不起，您注册失败，原因是:"+e.getMessage());
                } catch (PasswordErrorException e) {
                    System.out.println("对不起，您注册失败，原因是:"+e.getMessage());
                }finally {
                    showMenu();
                }
                break;
            case 2:
                try {
                    User u=login();
                    System.out.println("欢迎您:"+u.getUsername());
                } catch (UserNotExistException e) {
                    System.out.println("对不起，您登录失败，原因是:"+e.getMessage());
                } finally {
                    showMenu();
                }
                break;
            case 3:
                try {
                    modifyPassword();
                } catch (UserNotExistException e) {
                    System.out.println("修改失败，原因是:"+e.getMessage());
                } catch (PasswordErrorException e) {
                    System.out.println("修改失败，原因是:"+e.getMessage());
                } finally {
                    showMenu();
                }
                break;
            case 4:
                break;
            default:
                System.out.println("您输入有误，请重新输入");
                showMenu();

        }

    }

    /**
     * 注册功能
     * @throws UserExistException
     * @throws PasswordErrorException
     */
    public static void register() throws UserExistException, PasswordErrorException {
        User user=new User();
        user.setId(id++);
        System.out.print("请输入用户名:");
        String username=sc.next();//alice
        User isExistUser=findUserByName(username);//根据名字查找该用户是否存在
        if (isExistUser!=null){
            throw new UserExistException("用户已经被注册");
        }
        user.setUsername(username);
        System.out.print("请输入密码:");
        String password=sc.next();
        System.out.print("请再次输入密码:");
        String password2=sc.next();
        if(!password.equals(password2)){//两次密码不相等的时候
            throw new PasswordErrorException("两次输入的密码不一致");
        }
        user.setPassword(password);
        System.out.print("请输入手机号:");
        user.setPhone(sc.next());
        System.out.print("请输入地址:");
        user.setAddress(sc.next());

        users.add(user);//将用户添加到集合中去
        System.out.println(users);

    }

    /**
     * 根据用户名查找是否存在该用户
     * @param name
     * @return
     */
    public static User findUserByName(String name){
        for(User user:users){
            if(user.getUsername().equals(name)){
                return user;
            }
        }
        return null;
    }

    /**
     * 登录
     * @return
     * @throws UserNotExistException
     */
    public static User login() throws UserNotExistException {
        System.out.print("请输入用户名:");
        String name=sc.next();
        System.out.print("请输入密码:");
        String password=sc.next();
        for(User user:users){
            if(user.getUsername().equals(name) && user.getPassword().equals(password)){
                return user;
            }
        }
        throw new UserNotExistException("用户名或者密码错误");

    }

    public static void modifyPassword() throws UserNotExistException, PasswordErrorException {
        System.out.println("请输入需要修改密码用户的用户名:");
        String name=sc.next();
        User user=findUserByName(name);
        if(user==null){
            throw new UserNotExistException("该用户不存在");
        }
        System.out.println("请输入原来的密码:");
        String oldPassword=sc.next();
        if(!user.getPassword().equals(oldPassword)){
            throw new PasswordErrorException("原来的密码输入错误");
        }
        System.out.println("请输入新的密码:");
        String newPassword=sc.next();
        System.out.println("请再次输入新的密码:");
        String newPassword2=sc.next();
        if(!newPassword.equals(newPassword2)){
            throw new PasswordErrorException("两次输入的密码不一致");
        }
        user.setPassword(newPassword);
        System.out.println("恭喜您，密码修改成功");


    }


}
